﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NPlot;

namespace Lab2_1
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      #region Приводим к значениям по умолчанию метки
      this.label3.Text = "Число удвоений шага: 0";
      this.label4.Text = "Число ополовиниваний шага: 0";
      this.label8.Text = "Max ( S) = ";
      this.label9.Text = "Max (h_i) = ";
      this.label10.Text = "Min (h_i) = ";
      plotSurface2D1.Clear();
      this.dataGridView1.Rows.Clear();
      #endregion

      #region Считываем переменные и делаем работу
      double eps, h, u0, rightBorder,derU0,a,b;
      int nMax;
      nMax = Convert.ToInt32(this.textBox2.Text);
      eps = Convert.ToDouble(this.textBox1.Text);
      h = Convert.ToDouble(this.textBox3.Text);
      u0 = Convert.ToDouble(this.textBox4.Text);
      derU0 = Convert.ToDouble(this.textBox8.Text);
      a = Convert.ToDouble(this.textBox6.Text);
      b = Convert.ToDouble(this.textBox7.Text);
      rightBorder = Convert.ToDouble(this.textBox5.Text);
      MainEqation A = new MainEqation(); 
      A.createMainEqation(nMax, h, u0,derU0, eps, rightBorder);
      A.a = a;
      A.b = b;
      A.doSteps();
      #endregion

      #region Выводим значения меток на экран
      this.label3.Text = "Число удвоений шага: " + A.dNumber.ToString("G2");
      this.label4.Text = "Число ополовиниваний шага: " + A.hNumber.ToString("G2");
      this.label8.Text = "Max ( S) = " + A.maxS.ToString("E2");
      this.label9.Text = "Max (h_i) = " + A.maxH.ToString("G4") + ", x = " + A.maxHX.ToString("G4");
      this.label10.Text = "Min (h_i) = " + A.minH.ToString("G4") + ", x = " + A.minHX.ToString("G4");
      #endregion

      #region Вывод графика на экран
      double[] derV = new double[A.n + 1];
      double[] v = new double[A.n + 1];
      double[] x1 = new double[A.n + 1];
      for(int i = 0; i <= A.n; i++)
      {
        v[i] = A.v[i];
        x1[i] = A.x[i];
        derV[i] = A.derV[i];
      }
      // вывод численного решения на экран
      if (checkBox2.Checked)
      {
        LinePlot lp = new LinePlot();
        lp.OrdinateData = v;
        lp.AbscissaData = x1;
        lp.Pen = new Pen(Color.Blue, 1.0f);
        plotSurface2D1.Add(lp);
        plotSurface2D1.Refresh();
      }
      if (checkBox3.Checked)
      {
        LinePlot lp = new LinePlot();
        lp.OrdinateData = derV;
        lp.AbscissaData = v;
        lp.Pen = new Pen(Color.Red, 1.0f);
        plotSurface2D1.Add(lp);
        plotSurface2D1.Refresh();
      }
      #endregion
      if (this.checkBox1.Checked)
      {
        #region Вывод данных в таблицу
        for (int i = 0; i <= A.n; i++)
        {
          this.dataGridView1.Rows.Add();
          this.dataGridView1.Rows[i].Cells[0].Value = A.x[i].ToString("G6");
          this.dataGridView1.Rows[i].Cells[1].Value = A.v[i].ToString("G8");
          this.dataGridView1.Rows[i].Cells[2].Value = A.v2[i].ToString("G8");
          this.dataGridView1.Rows[i].Cells[3].Value = (A.v[i] - A.v2[i]).ToString("E2");
          this.dataGridView1.Rows[i].Cells[4].Value = A.S[i].ToString("E2");
          this.dataGridView1.Rows[i].Cells[5].Value = A.hArray[i].ToString("G4");


        }
      }
      #endregion

    }
  }
}
